/**
 * API 调用辅助函数
 * 统一处理 API 调用的加载状态和错误处理
 */
import { ElMessage } from 'element-plus'

/**
 * 执行 API 调用并处理加载状态
 * @param {Function} apiCall - API 调用函数
 * @param {Object} loadingRef - 加载状态的 ref
 * @param {Object} options - 选项
 * @param {Function} options.onSuccess - 成功回调
 * @param {Function} options.onError - 错误回调
 * @param {*} options.fallbackData - 失败时的后备数据
 * @returns {Promise<*>} API 响应数据
 */
export async function executeWithLoading(apiCall, loadingRef, options = {}) {
  const { onSuccess, onError, fallbackData } = options

  try {
    if (loadingRef) {
      loadingRef.value = true
    }

    const response = await apiCall()

    if (onSuccess) {
      onSuccess(response)
    }

    return response
  } catch (error) {
    console.error('API 调用失败:', error)

    if (onError) {
      onError(error)
    } else if (fallbackData !== undefined) {
      return fallbackData
    }

    throw error
  } finally {
    if (loadingRef) {
      loadingRef.value = false
    }
  }
}

/**
 * 执行分页数据加载
 * @param {Function} apiCall - API 调用函数
 * @param {Object} refs - 相关的 ref 对象
 * @param {Object} refs.loading - 加载状态
 * @param {Object} refs.list - 数据列表
 * @param {Object} refs.total - 总数
 * @param {Object} options - 选项
 * @param {*} options.fallbackData - 失败时的后备数据
 * @returns {Promise<void>}
 */
export async function loadPaginatedData(apiCall, refs, options = {}) {
  const { loading, list, total } = refs
  const { fallbackData = [] } = options

  await executeWithLoading(
    apiCall,
    loading,
    {
      onSuccess: (response) => {
        list.value = response.data.list || []
        total.value = response.data.total || 0
      },
      onError: () => {
        list.value = fallbackData
        total.value = fallbackData.length
      }
    }
  )
}

/**
 * 创建标准的列表加载函数
 * @param {Function} apiFunction - API 函数
 * @param {Object} refs - 相关的 ref 对象
 * @param {Function} getParams - 获取参数的函数
 * @param {Object} options - 选项
 * @returns {Function} 加载函数
 */
export function createListLoader(apiFunction, refs, getParams, options = {}) {
  return async () => {
    const params = getParams()
    await loadPaginatedData(
      () => apiFunction(params),
      refs,
      options
    )
  }
}

/**
 * 简化的 API 调用函数，自动处理成功和错误
 * @param {Function} apiCall - API 调用函数
 * @param {Object} options - 选项
 * @param {Function} options.onSuccess - 成功回调
 * @param {Function} options.onError - 错误回调
 * @param {string} options.successMessage - 成功消息
 * @param {string} options.errorMessage - 错误消息
 * @returns {Promise<*>} API 响应数据
 */
export async function callAPI(apiCall, options = {}) {
  const { onSuccess, onError, successMessage, errorMessage } = options

  try {
    const response = await apiCall()

    if (onSuccess) {
      onSuccess(response)
    }

    if (successMessage) {
      ElMessage.success(successMessage)
    }

    return response
  } catch (error) {
    console.error('API 调用失败:', error)

    if (onError) {
      onError(error)
    }

    // 错误消息已经在拦截器中处理了，这里不需要重复显示
    throw error
  }
}

/**
 * 创建简单的数据加载函数
 * @param {Function} apiFunction - API 函数
 * @param {Object} dataRef - 数据的 ref
 * @param {Object} loadingRef - 加载状态的 ref
 * @param {Object} options - 选项
 * @returns {Function} 加载函数
 */
export function createDataLoader(apiFunction, dataRef, loadingRef, options = {}) {
  const { fallbackData, transform } = options

  return async (params) => {
    await executeWithLoading(
      () => apiFunction(params),
      loadingRef,
      {
        onSuccess: (response) => {
          const data = transform ? transform(response.data) : response.data
          if (dataRef.value && typeof dataRef.value === 'object' && !Array.isArray(dataRef.value)) {
            Object.assign(dataRef.value, data)
          } else {
            dataRef.value = data
          }
        },
        onError: () => {
          if (fallbackData !== undefined) {
            if (dataRef.value && typeof dataRef.value === 'object' && !Array.isArray(dataRef.value)) {
              Object.assign(dataRef.value, fallbackData)
            } else {
              dataRef.value = fallbackData
            }
          }
        }
      }
    )
  }
}
